/*!
 * \file WtDtRunner.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader数据运行器头文件
 * 
 * \details 本文件定义了WonderTrader数据服务系统的核心运行器类WtDtRunner：
 *          - 数据服务系统的主控制器和协调器
 *          - 管理数据解析器（Parser）和数据导出器（Dumper）
 *          - 支持扩展Parser接口，允许自定义行情解析器
 *          - 支持扩展Dumper接口，允许自定义数据导出器
 *          - 集成数据管理器、状态监控、UDP广播等核心组件
 *          - 提供异步IO支持和多线程处理能力
 *          - 支持实时行情数据处理和历史数据导出
 *          - 支持Level2数据（订单队列、订单明细、逐笔成交）处理
 */
#pragma once
#include "PorterDefs.h"
#include "ExpDumper.h"

#include "../WtDtCore/DataManager.h"
#include "../WtDtCore/ParserAdapter.h"
#include "../WtDtCore/StateMonitor.h"
#include "../WtDtCore/UDPCaster.h"

#include "../WTSTools/WTSHotMgr.h"
#include "../WTSTools/WTSBaseDataMgr.h"

#include <boost/asio.hpp>
#include <boost/asio/post.hpp>

NS_WTP_BEGIN
class WTSVariant;
NS_WTP_END

/**
 * @class WtDtRunner
 * @brief WonderTrader数据运行器类
 * 
 * @details WtDtRunner是WonderTrader数据服务系统的核心控制器，负责：
 *          - 系统初始化和配置管理
 *          - 数据解析器（Parser）生命周期管理
 *          - 数据导出器（Dumper）生命周期管理
 *          - 扩展Parser接口实现和回调处理
 *          - 扩展Dumper接口实现和数据导出
 *          - 实时行情数据处理和分发
 *          - 历史数据管理和导出
 *          - 异步IO处理和多线程协调
 *          - 状态监控和UDP广播功能
 * 
 * @note 该类采用单例模式，通过全局函数getRunner()获取实例
 * @warning 必须先调用initialize()进行初始化，再调用start()启动服务
 */
class WtDtRunner
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化数据运行器，设置默认参数
	 */
	WtDtRunner();
	
	/**
	 * @brief 析构函数
	 * @details 清理资源，释放所有组件
	 */
	~WtDtRunner();

public:
	/**
	 * @brief 初始化数据运行器
	 * @details 根据配置文件初始化数据服务系统的各个组件
	 * @param cfgFile 主配置文件路径
	 * @param logCfg 日志配置文件路径
	 * @param modDir 模块目录路径（默认为空）
	 */
	void	initialize(const char* cfgFile, const char* logCfg, const char* modDir = "");
	
	/**
	 * @brief 启动数据运行器
	 * @details 启动数据服务系统，开始数据处理
	 * @param bAsync 是否异步启动（默认为false）
	 * @param bAlldayMode 是否全天模式（默认为false）
	 */
	void	start(bool bAsync = false, bool bAlldayMode = false);

	/**
	 * @brief 创建扩展Parser
	 * @details 创建一个扩展的行情解析器实例
	 * @param id Parser标识符
	 * @return bool 创建是否成功
	 */
	bool	createExtParser(const char* id);


//////////////////////////////////////////////////////////////////////////
//扩展Parser
public:
	/**
	 * @brief 注册Parser Porter回调
	 * @details 注册扩展Parser的事件回调和订阅回调函数
	 * @param cbEvt Parser事件回调函数
	 * @param cbSub Parser订阅回调函数
	 */
	void registerParserPorter(FuncParserEvtCallback cbEvt, FuncParserSubCallback cbSub);

	/**
	 * @brief Parser初始化回调
	 * @details 处理Parser初始化完成事件
	 * @param id Parser标识符
	 */
	void parser_init(const char* id);
	
	/**
	 * @brief Parser连接回调
	 * @details 处理Parser连接成功事件
	 * @param id Parser标识符
	 */
	void parser_connect(const char* id);
	
	/**
	 * @brief Parser释放回调
	 * @details 处理Parser资源释放事件
	 * @param id Parser标识符
	 */
	void parser_release(const char* id);
	
	/**
	 * @brief Parser断开连接回调
	 * @details 处理Parser断开连接事件
	 * @param id Parser标识符
	 */
	void parser_disconnect(const char* id);
	
	/**
	 * @brief Parser订阅回调
	 * @details 处理Parser合约订阅事件
	 * @param id Parser标识符
	 * @param code 合约代码
	 */
	void parser_subscribe(const char* id, const char* code);
	
	/**
	 * @brief Parser退订回调
	 * @details 处理Parser合约退订事件
	 * @param id Parser标识符
	 * @param code 合约代码
	 */
	void parser_unsubscribe(const char* id, const char* code);

	/**
	 * @brief 扩展Parser行情数据处理
	 * @details 处理来自扩展Parser的实时行情数据
	 * @param id Parser标识符
	 * @param curTick 当前tick数据
	 * @param uProcFlag 处理标志
	 */
	void on_ext_parser_quote(const char* id, WTSTickStruct* curTick, uint32_t uProcFlag);

//////////////////////////////////////////////////////////////////////////
//扩展Dumper
public:
	/**
	 * @brief 创建扩展Dumper
	 * @details 创建一个扩展的数据导出器实例
	 * @param id Dumper标识符
	 * @return bool 创建是否成功
	 */
	bool createExtDumper(const char* id);

	/**
	 * @brief 注册扩展Dumper
	 * @details 注册扩展Dumper的K线和tick数据导出回调函数
	 * @param barDumper K线数据导出回调函数
	 * @param tickDumper tick数据导出回调函数
	 */
	void registerExtDumper(FuncDumpBars barDumper, FuncDumpTicks tickDumper);

	/**
	 * @brief 注册扩展高频数据Dumper
	 * @details 注册扩展Dumper的高频数据（订单队列、订单明细、逐笔成交）导出回调函数
	 * @param ordQueDumper 订单队列导出回调函数
	 * @param ordDtlDumper 订单明细导出回调函数
	 * @param transDumper 逐笔成交导出回调函数
	 */
	void registerExtHftDataDumper(FuncDumpOrdQue ordQueDumper, FuncDumpOrdDtl ordDtlDumper, FuncDumpTrans transDumper);

	/**
	 * @brief 导出历史K线数据
	 * @details 通过扩展Dumper导出指定合约的历史K线数据
	 * @param id Dumper标识符
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param bars K线数据数组
	 * @param count K线数据数量
	 * @return bool 导出是否成功
	 */
	bool dumpHisBars(const char* id, const char* stdCode, const char* period, WTSBarStruct* bars, uint32_t count);

	/**
	 * @brief 导出历史tick数据
	 * @details 通过扩展Dumper导出指定合约的历史tick数据
	 * @param id Dumper标识符
	 * @param stdCode 标准合约代码
	 * @param uDate 交易日期
	 * @param ticks tick数据数组
	 * @param count tick数据数量
	 * @return bool 导出是否成功
	 */
	bool dumpHisTicks(const char* id, const char* stdCode, uint32_t uDate, WTSTickStruct* ticks, uint32_t count);

	/**
	 * @brief 导出历史订单队列数据
	 * @details 通过扩展Dumper导出指定合约的历史订单队列数据
	 * @param id Dumper标识符
	 * @param stdCode 标准合约代码
	 * @param uDate 交易日期
	 * @param item 订单队列数据数组
	 * @param count 订单队列数据数量
	 * @return bool 导出是否成功
	 */
	bool dumpHisOrdQue(const char* id, const char* stdCode, uint32_t uDate, WTSOrdQueStruct* item, uint32_t count);

	/**
	 * @brief 导出历史订单明细数据
	 * @details 通过扩展Dumper导出指定合约的历史订单明细数据
	 * @param id Dumper标识符
	 * @param stdCode 标准合约代码
	 * @param uDate 交易日期
	 * @param items 订单明细数据数组
	 * @param count 订单明细数据数量
	 * @return bool 导出是否成功
	 */
	bool dumpHisOrdDtl(const char* id, const char* stdCode, uint32_t uDate, WTSOrdDtlStruct* items, uint32_t count);

	/**
	 * @brief 导出历史逐笔成交数据
	 * @details 通过扩展Dumper导出指定合约的历史逐笔成交数据
	 * @param id Dumper标识符
	 * @param stdCode 标准合约代码
	 * @param uDate 交易日期
	 * @param items 逐笔成交数据数组
	 * @param count 逐笔成交数据数量
	 * @return bool 导出是否成功
	 */
	bool dumpHisTrans(const char* id, const char* stdCode, uint32_t uDate, WTSTransStruct* items, uint32_t count);

private:
	/**
	 * @brief 初始化数据管理器
	 * @details 根据配置初始化数据管理器组件
	 * @param config 配置对象
	 * @param bAlldayMode 是否全天模式（默认为false）
	 */
	void initDataMgr(WTSVariant* config, bool bAlldayMode = false);
	
	/**
	 * @brief 初始化解析器
	 * @details 根据配置文件初始化所有解析器
	 * @param filename 解析器配置文件名
	 */
	void initParsers(const char* filename);

private:

	WTSBaseDataMgr	_bd_mgr;		/*!< 基础数据管理器 */
//	WTSHotMgr		_hot_mgr;		/*!< 主力合约管理器（已注释） */
	boost::asio::io_context _async_io;	/*!< 异步IO上下文 */
	StateMonitor	_state_mon;		/*!< 状态监控器 */
	UDPCaster		_udp_caster;	/*!< UDP广播器 */
	DataManager		_data_mgr;		/*!< 数据管理器 */
	ParserAdapterMgr	_parsers;	/*!< 解析器适配器管理器 */

	FuncParserEvtCallback	_cb_parser_evt;	/*!< Parser事件回调函数 */
	FuncParserSubCallback	_cb_parser_sub;	/*!< Parser订阅回调函数 */

	FuncDumpBars	_dumper_for_bars;	/*!< K线数据导出回调函数 */
	FuncDumpTicks	_dumper_for_ticks;	/*!< tick数据导出回调函数 */

	FuncDumpOrdQue	_dumper_for_ordque;	/*!< 订单队列导出回调函数 */
	FuncDumpOrdDtl	_dumper_for_orddtl;	/*!< 订单明细导出回调函数 */
	FuncDumpTrans	_dumper_for_trans;	/*!< 逐笔成交导出回调函数 */

	typedef std::shared_ptr<ExpDumper> ExpDumperPtr;	/*!< 扩展Dumper智能指针类型 */
	typedef std::map<std::string, ExpDumperPtr>  ExpDumpers;	/*!< 扩展Dumper容器类型 */
	ExpDumpers		_dumpers;		/*!< 扩展Dumper容器 */
};

